In C++, ogni espressione produce un lvalue oppure un rvalue. Questa distinzione definisce se un'espressione si riferisce all'identità di un oggetto identità (dove si trova) o al suo valore (ciò che contiene).
1. Identità vs. Contenuti
Un lvalue (valore di posizionamento) rappresenta un oggetto con un indirizzo di memoria persistente. Pensalo come una scatola etichettata nella RAM. In modo opposto, un rvalue (valore di lettura) è transitorio; rappresenta un risultato temporaneo o un valore letterale che non ha un indirizzo accessibile al programmatore.
2. Transizioni Funzionali
Mentre un lvalue può agire da rvalue (il compilatore recupera semplicemente il valore all'interno della scatola), il contrario è vietato. Non puoi usare un rvalue dove è richiesto un lvalue—ad esempio, non puoi prendere l'indirizzo di un numero letterale come &42 perché manca di un'identità persistente.
$$ \text{Lvalue} \xrightarrow{\text{Conversione}} \text{Rvalue} \quad (\text{Consentito}) $$
$$ \text{Rvalue} \xrightarrow{\text{Assegnazione}} \text{Lvalue} \quad (\text{Vietato}) $$